package top.eggcode.system.common.consts;

import top.eggcode.common.error.ServiceLogicException;

public enum Metrics {
    /* Cpu */
    // 核心数
    CPU_CORES("cpu/cores", "1"),
    // 空闲率
    CPU_PERCENT_IDLE("cpu/percent_idle", "2"),
    // 内核空间占用率
    CPU_PERCENT_SYSTEM("cpu/percent_system", "3"),
    // 用户空间占用率
    CPU_PERCENT_USER("cpu/percent_user", "4"),
    // 总使用率
    CPU_PERCENT_USED("cpu/percent_used", "5"),
    // 其他占用率
    CPU_PERCENT_OTHER("cpu/percent_other", "6"),
    // 等待 IO 占用率
    CPU_PERCENT_WAIT("cpu/percent_wait", "7"),

    /* Disk */
    // 读取字节数
    DISK_READ_BYTES("disk/read_bytes", "8"),
    // 读取操作数
    DISK_READ_OPS("disk/read_ops", "9"),
    // 写入字节数
    DISK_WRITE_BYTES("disk/write_bytes", "10"),
    // 写入操作数
    DISK_WRITE_OPS("disk/write_bytes", "11"),
    // 使用率
    DISK_PERCENT_USED("disk/percent_used", "12"),
    // 磁盘总量
    DISK_BYTES_TOTAL("disk/bytes_total", "13"),
    // 剩余用户空间
    DISK_BYTES_AVAIL("disk/bytes_avail", "14"),

    /* Memory */
    // 内存总量
    MEMORY_BYTES_TOTAL("memory_bytes_total", "15"),
    // 使用字节数
    MEMORY_BYTES_USED("memory_bytes_used", "16"),
    // 使用率
    MEMORY_PERCENT_USED("memory_percent_used", "17"),
    // 实际使用字节数
    MEMORY_BYTES_ACTUAL_USED("memory_bytes_actual_used", "18"),
    // 剩余内存率
    MEMORY_PERCENT_FREE("memory_percent_free", "19"),

    /* network */
    // 入口字节数
    NETWORK_RECEIVED_BYTES("network_received_bytes", "20"),
    // 入口数据包统计
    NETWORK_RECEIVED_PACKETS("network_received_packets", "21"),
    // 出口字节数
    NETWORK_SEND_BYTES("network_send_bytes", "22"),
    // 出口数据包统计
    NETWORK_SEND_PACKETS_COUNT("network_send_packets_count", "23"),
    // tcp 连接数
    NETWORK_TCP_CONNECTIONS("network_tcp_connections", "24");
    private final String name;

    private final String code;

    Metrics(String name, String code) {
        this.name = name;
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public String getCode() {
        return code;
    }

    /**
     * 获取标识
     *
     * @param name 指标名称
     * @return id
     */
    public static String getCode(String name) {
        for (Metrics metric : Metrics.values()) {
            if (name.equals(metric.getName())) {
                return metric.getCode();
            }
        }
        throw new ServiceLogicException("name 不存在");
    }
}
